;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	sine.asm
;
;	sine / cosine routines and data table
;
;	2004-01  Scott Lawrence
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	.module sine

; sine
        ;; sine - get the sine of a
        ;               in      c       value to look up
        ;               out     a       sine value 0..256
        ;               mod     -
sine::
            ; set aside registers
        push    hl
        push    bc
            ; look up the value in the sine table
        ld      hl, #(.sinetab)	; hl = sinetable base
        ld      b, #0x00        ; b = 0
        add     hl, bc          ; hl += bc
        ld      a, (hl)         ; a = sine(c)
            ; restore registers
        pop     bc
        pop     hl
            ; return
        ret

; cosine
        ;; cosine - get the cosine of a
        ;               in      c       value to look up
        ;               out     a       cosine value 0..256
        ;               mod     f
cosine::
            ; set aside registers
        push    bc
            ; add 180 degrees, call sine
        ld      a, #0x3f
        add     a, c
        ld      c, a
        call    sine
            ; restore registers 
        pop     bc
            ; return
        ret

.sinetab::
	.byte   0x80, 0x83, 0x86, 0x89, 0x8c, 0x8f, 0x92
	.byte   0x95, 0x99, 0x9c, 0x9f, 0xa2, 0xa5, 0xa8
	.byte   0xab, 0xae, 0xb1, 0xb4, 0xb6, 0xb9, 0xbc
	.byte   0xbf, 0xc2, 0xc4, 0xc7, 0xc9, 0xcc, 0xcf
	.byte   0xd1, 0xd3, 0xd6, 0xd8, 0xda, 0xdc, 0xdf
	.byte   0xe1, 0xe3, 0xe5, 0xe7, 0xe8, 0xea, 0xec
	.byte   0xee, 0xef, 0xf1, 0xf2, 0xf3, 0xf5, 0xf6
	.byte   0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd
	.byte   0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff
	.byte   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe
	.byte   0xfe, 0xfd, 0xfd, 0xfc, 0xfb, 0xfb, 0xfa
	.byte   0xf9, 0xf8, 0xf7, 0xf5, 0xf4, 0xf3, 0xf1
	.byte   0xf0, 0xee, 0xed, 0xeb, 0xe9, 0xe8, 0xe6
	.byte   0xe4, 0xe2, 0xe0, 0xde, 0xdb, 0xd9, 0xd7
	.byte   0xd5, 0xd2, 0xd0, 0xcd, 0xcb, 0xc8, 0xc6
	.byte   0xc3, 0xc0, 0xbd, 0xbb, 0xb8, 0xb5, 0xb2
	.byte   0xaf, 0xac, 0xa9, 0xa6, 0xa3, 0xa0, 0x9d
	.byte   0x9a, 0x97, 0x94, 0x91, 0x8e, 0x8b, 0x87
	.byte   0x84, 0x81, 0x7e, 0x7b, 0x78, 0x74, 0x71
	.byte   0x6e, 0x6b, 0x68, 0x65, 0x62, 0x5f, 0x5c
	.byte   0x59, 0x56, 0x53, 0x50, 0x4d, 0x4a, 0x47
	.byte   0x44, 0x42, 0x3f, 0x3c, 0x39, 0x37, 0x34  
	.byte   0x32, 0x2f, 0x2d, 0x2a, 0x28, 0x26, 0x24
	.byte   0x21, 0x1f, 0x1d, 0x1b, 0x19, 0x17, 0x16
	.byte   0x14, 0x12, 0x11, 0x0f, 0x0e, 0x0c, 0x0b
	.byte   0x0a, 0x08, 0x07, 0x06, 0x05, 0x04, 0x04
	.byte   0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00
	.byte   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	.byte   0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x04
	.byte   0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0c
	.byte   0x0d, 0x0e, 0x10, 0x11, 0x13, 0x15, 0x17
	.byte   0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x23, 0x25
	.byte   0x27, 0x29, 0x2c, 0x2e, 0x30, 0x33, 0x36
	.byte   0x38, 0x3b, 0x3d, 0x40, 0x43, 0x46, 0x49
	.byte   0x4b, 0x4e, 0x51, 0x54, 0x57, 0x5a, 0x5d
	.byte   0x60, 0x63, 0x66, 0x6a, 0x6d, 0x70, 0x73
	.byte   0x76, 0x79, 0x7c, 0x7f
